iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 19
0
自我挑戰組

Micropython x ESP H/W 之三十個錦囊妙計系列 第 19

[錦囊XIV] Sleep 的種類有哪些及如何喚醒睡眠中的裝置呢?

  • 分享至 

  • xImage
  •  

ESP 裝置提供以下幾種Sleep 的形式
https://ithelp.ithome.com.tw/upload/images/20181030/20103824EMuq6txEyn.png

使用方式:

  • Idle
import machine
machine.idle()

[秘訣] 筆者很喜歡把try .. exception 中的例外情況下 直接置入machine.idle() , 讓ESP 裝置遇到問題的時候會直接回到Idle 模式, 方便後續除錯使用

  • sleep
>>> machine.sleep()
Warning: not yet implemented

[秘訣] 筆者在實行後發現這功能尚未完成, 所以會出現警告訊息

  • deepsleep
    [秘訣] 在深度睡眠的情況下, 能夠把裝置喚醒的方式只有使用Hardware Reset button RTC的方式才能夠喚醒

[實做]
以RTC為例 程式將在進入深度睡眠前, 在terminal 顯示倒數的訊息並且在每次啟動duration [自定義的秒數]後再次進入深度睡眠

  1. 設定觸發中斷的事件來源及想要被喚醒的睡眠模式
import machine
import time
duration=8000 # ms 
rtc = machine.RTC()
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
rtc.alarm(rtc.ALARM0, duration)
    ---- 這個區段寫主要或其他功能 ----
            ............
            ............
    ---- 這個區段寫主要或其他功能 ----
    
    ---- 這個區段放置醒了後要做啥事情 ----
if machine.reset_cause() == machine.DEEPSLEEP_RESET:
    print('Woke up from Deep sleep')
for i in range(3):
    print('Wait for going deep sleep in {} sec'.format(3-i))
    time.sleep(1)
    ---- 這個區段放置醒了後要做啥事情 ----
machine.deepsleep()

[秘訣]
(1) reset_cause 總共有下面這幾種模式:

  • machine.PWRON_RESET
  • machine.HARD_RESET
  • machine.WDT_RESET
  • machine.DEEPSLEEP_RESET
  • machine.SOFT_RESET
    (2) 從深度睡眠回來後, 裝置會自動先去讀取boot.py再重新執行main.py
    (3) 筆者試圖使用看門狗計時器來實做, 不過在設定timeout的秒數後會出現錯誤, 這個功能可能暫時還無法使用
    做法如下: (如果有興趣的朋友, 以後可以試試看)
>>> from machine import WDT
>>> wdt = WDT(timeout=2000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: function do3es not take keywork arguments

PS: 筆者發現如果沒有給與timeout的數值, 就可以成功啟用, 但wdt.feed的功能還是無效, 猜測可能要等之後的版本才有完整的功能

>>> wdt = WDT()
>>> wdt.feed()

上一篇
[錦囊XVIII] 二進制處理方式 [下] --- pack
下一篇
[錦囊XX] 程式掛掉後該如何自動重跑呢? [以try ... except為例]
系列文
Micropython x ESP H/W 之三十個錦囊妙計31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言